package controller

import (
	"net/http"
	"strconv"

	"goscan-mgt/model"
	"goscan-mgt/service"
	"goscan-mgt/utils"

	"github.com/gin-gonic/gin"
)

type ServiceInfoController struct {
	service *service.ServiceInfoService
}

func NewServiceInfoController() *ServiceInfoController {
	serviceInfo := service.NewServiceInfoService()
	return &ServiceInfoController{service: serviceInfo}
}

// GetAllServiceInfo 获取所有服务信息
// @Summary 获取所有服务信息
// @Description 获取所有服务信息列表，支持分页查询
// @Tags 服务信息
// @Produce json
// @Param page query int false "页码" default(1)
// @Param page_size query int false "每页数量" default(10)
// @Success 200 {object} utils.Response "成功返回分页的服务信息列表"
// @Failure 500 {object} utils.Response "服务器内部错误"
// @Router /service_info [get]
func (c *ServiceInfoController) GetAllServiceInfo(ctx *gin.Context) {
	// 解析分页参数
	page, _ := strconv.Atoi(ctx.DefaultQuery("page", "1"))
	pageSize, _ := strconv.Atoi(ctx.DefaultQuery("page_size", "10"))

	infos, err := c.service.GetPaginatedServiceInfo(page, pageSize)
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, utils.NewBuilder().Error(err.Error()).Build())
		return
	}

	ctx.JSON(http.StatusOK, utils.NewBuilder().Success(infos).Build())
}

// GetServiceInfoById 根据ID获取服务信息
// @Summary 获取服务信息
// @Description 根据ID获取服务信息
// @Tags 服务信息
// @Produce json
// @Param id path int true "服务信息ID"
// @Success 200 {object} utils.Response
// @Failure 400 {object} utils.Response
// @Failure 404 {object} utils.Response
// @Router /service_info/{id} [get]
func (c *ServiceInfoController) GetServiceInfoById(ctx *gin.Context) {
	idStr := ctx.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 64)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, utils.NewBuilder().Error("无效的ID").Build())
		return
	}
	result, err := c.service.GetServiceInfoByID(uint(id))
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, utils.NewBuilder().Error(err.Error()).Build())
		return
	}
	ctx.JSON(http.StatusOK, utils.NewBuilder().Success(result).Build())
}

// CreateServiceInfo 创建服务信息
// @Summary 创建服务信息
// @Description 创建一个新的服务信息
// @Tags 服务信息
// @Accept json
// @Produce json
// @Param serviceInfo body model.ServiceInfo true "服务信息对象"
// @Success 201 {object} utils.Response
// @Failure 400 {object} utils.Response
// @Router /service_info [post]
func (c *ServiceInfoController) CreateServiceInfo(ctx *gin.Context) {
	var info model.ServiceInfo
	if err := ctx.ShouldBindJSON(&info); err != nil {
		ctx.JSON(http.StatusBadRequest, utils.NewBuilder().Error(err.Error()).Build())
		return
	}
	if err := c.service.CreateServiceInfo(&info); err != nil {
		ctx.JSON(http.StatusInternalServerError, utils.NewBuilder().Error(err.Error()).Build())
		return
	}
	ctx.JSON(http.StatusCreated, utils.NewBuilder().Success(info).Build())
}

// UpdateServiceInfo 更新服务信息
// @Summary 更新服务信息
// @Description 更新指定ID的服务信息
// @Tags 服务信息
// @Accept json
// @Produce json
// @Param id path int true "服务信息ID"
// @Param serviceInfo body model.ServiceInfo true "服务信息对象"
// @Success 200 {object} utils.Response
// @Failure 400 {object} utils.Response
// @Failure 404 {object} utils.Response
// @Router /service_info/{id} [put]
func (c *ServiceInfoController) UpdateServiceInfo(ctx *gin.Context) {
	idStr := ctx.Param("id")
	id, err := strconv.Atoi(idStr)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, utils.NewBuilder().Error("无效的服务信息ID").Build())
		return
	}
	var info model.ServiceInfo
	if err := ctx.ShouldBindJSON(&info); err != nil {
		ctx.JSON(http.StatusBadRequest, utils.NewBuilder().Error(err.Error()).Build())
		return
	}
	info.ID = uint(id)
	if err := c.service.UpdateServiceInfo(&info); err != nil {
		ctx.JSON(http.StatusNotFound, utils.NewBuilder().Error("服务信息未找到").Build())
		return
	}
	ctx.JSON(http.StatusOK, utils.NewBuilder().Success(info).Build())
}

// DeleteServiceInfo 删除服务信息
// @Summary 删除服务信息
// @Description 根据ID删除服务信息
// @Tags 服务信息
// @Param id path int true "服务信息ID"
// @Success 204 {object} utils.Response
// @Failure 400 {object} utils.Response
// @Failure 404 {object} utils.Response
// @Router /service_info/{id} [delete]
func (c *ServiceInfoController) DeleteServiceInfo(ctx *gin.Context) {
	idStr := ctx.Param("id")
	id, err := strconv.Atoi(idStr)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, utils.NewBuilder().Error("无效的服务信息ID").Build())
		return
	}
	if err := c.service.DeleteServiceInfo(uint(id)); err != nil {
		ctx.JSON(http.StatusNotFound, utils.NewBuilder().Error("服务信息未找到").Build())
		return
	}
	ctx.JSON(http.StatusNoContent, utils.NewBuilder().Success(nil).Build())
}
